home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 8.5 KB | 394 lines | [TEXT/CCL2] |
- ;;; File: ast/exp-structs Author: John
-
- ;;; These ast structures define the expression syntax
-
-
- ;;; This is simplified; there are additional rules for associativity and
- ;;; precedence.
- ;;;
- ;;; <exp> -> <lambda-exp>
- ;;; -> <let-exp>
- ;;; -> <if-exp>
- ;;; -> <case-exp>
- ;;; -> <signature-exp>
- ;;; -> <exp> <op> <exp> ; treated like <fn-app>
- ;;; -> - <exp>
- ;;; -> <fn-app>
- ;;; -> <aexp>
- ;;;
-
- (define-struct exp
- (include ast-node))
-
-
- ;;; <lambda-exp> -> \ <apat> ... <apat> -> <exp>
-
- (define-struct lambda
- (include exp)
- (slots
- (pats (type (list pattern)))
- (body (type exp))))
-
- ;;; <let-exp> -> let { <decls> [;] } in <exp>
-
- (define-struct let
- (include exp)
- (slots
- (decls (type (list decl)))
- (body (type exp))))
-
- ;;; <if-exp> -> if <exp> then <exp> else <exp>
-
- (define-struct if
- (include exp)
- (slots
- (test-exp (type exp))
- (then-exp (type exp))
- (else-exp (type exp))))
-
-
- ;;; <case-exp> -> case <exp> of { <alts> [;] }
- ;;;
- ;;; <alts> -> <alt> ; ... ; <alt>
- ;;;
- ;;; <alt> -> <pat> -> exp [where { <decls> [;] } ]
- ;;; -> <pat> <gdpat> [where { <decls> [;] } ]
-
- (define-struct case
- (include exp)
- (slots
- (exp (type exp))
- (alts (type (list alt)))))
-
- (define-struct alt
- (include ast-node)
- (slots
- (pat (type pattern))
- ;; defined in valdef-structs
- (rhs-list (type (list guarded-rhs)))
- (where-decls (type (list decl)))
- ;; used internally by cfn
- (test (type (maybe exp)) (default '#f))
- ; uses to mark internally generated fall through alts
- (avoid-printing? (type bool) (default '#f) (bit #t))
- ))
-
- ;;; <signature-exp> -> <exp> :: [<context> =>] <atype>
-
- (define-struct exp-sign
- (include exp)
- (slots
- (exp (type exp))
- (signature (type signature))))
-
-
- ;;; <fn-app> -> <exp> <aexp>
-
- (define-struct app
- (include exp)
- (predicate app?)
- (slots
- (fn (type exp))
- (arg (type exp))))
-
- ;;; <aexp> -> <var> var-ref
- ;;; -> <con> con-ref
- ;;; -> <literal> const
- ;;; -> () constructor is Unit
- ;;; -> ( <exp> )
- ;;; -> ( <exp> , ... , <exp> ) constructor is a tuple
- ;;; -> [ <exp> , ... , <exp> ] list
- ;;; -> <sequence>
- ;;; -> [exp> | <qual> , ... , <qual>] list-comp
- ;;; -> ( <exp> <op> ) section-r
- ;;; -> ( <op> <exp> ) section-l
- ;;;
-
- (define-struct aexp
- (include exp))
-
-
- (define-struct var-ref
- (include aexp)
- (predicate var-ref?)
- (slots
- (name (type symbol))
- (var (type def))
- (infix? (type bool) (bit #t))))
-
- (define-struct con-ref
- (include aexp)
- (predicate con-ref?)
- (slots
- (name (type symbol))
- (con (type def))
- (infix? (type bool) (bit #t))))
-
- (define-struct const
- (include aexp)
- (slots
- (overloaded? (type bool) (default '#t) (bit #t))))
-
- (define-struct integer-const
- (include const)
- (predicate integer-const?)
- (slots
- (value (type integer))))
-
- (define-struct float-const
- (include const)
- (predicate float-const?)
- (slots
- (numerator (type integer))
- (denominator (type integer))
- (exponent (type integer))))
-
- (define-struct char-const
- (include const)
- (predicate char-const?)
- (slots
- (value (type char))))
-
- (define-struct string-const
- (include const)
- (predicate string-const?)
- (slots
- (value (type string))))
-
- (define-struct list-exp
- (include aexp)
- (slots
- (exps (type (list exp)))))
-
- (define-struct bottom
- (include aexp)
- (slots
- (context (type (maybe valdef)) (default #f))))
-
- ;;; <sequence> -> [ <exp> .. ] sequence
- ;;; -> [ <exp>, <exp> .. ] sequence-then
- ;;; -> [ <exp> .. <exp> ] sequence-to
- ;;; -> [ <exp>, <exp> .. <exp> ] sequence-then-to
-
- (define-struct sequence
- (include aexp)
- (slots
- (from (type exp))))
-
- (define-struct sequence-to
- (include aexp)
- (slots
- (from (type exp))
- (to (type exp))))
-
-
- (define-struct sequence-then
- (include aexp)
- (slots
- (from (type exp))
- (then (type exp))))
-
- (define-struct sequence-then-to
- (include aexp)
- (slots
- (from (type exp))
- (then (type exp))
- (to (type exp))))
-
- (define-struct list-comp
- (include aexp)
- (slots
- (exp (type exp))
- (quals (type (list qual)))))
-
- ;;; Op on left
- (define-struct section-l
- (include aexp)
- (slots
- (exp (type exp))
- (op (type exp)))) ; either con-ref or var-ref
-
- (define-struct section-r
- (include aexp)
- (slots
- (exp (type exp))
- (op (type exp)))) ; either con-ref or var-ref
-
- ;;; <qual> -> <pat> <- <exp>
- ;;; -> <exp>
-
- (define-struct qual
- (include ast-node))
-
- (define-struct qual-generator
- (include qual)
- (slots
- (pat (type pattern))
- (exp (type exp))))
-
- (define-struct qual-filter
- (include qual)
- (slots
- (exp (type exp))))
-
-
- ;;; This is used as the guard slot in a guarded-rhs to represent lack of a
- ;;; guard. This is the same as True.
-
- (define-struct omitted-guard ; same as True; should print in the guardless form
- (include exp))
-
-
- ;;; These structures are used by the precedence parser.
-
- (define-struct pp-exp-list ; list of expressions & ops for the prec parser
- (include exp)
- (slots
- (exps (type (list exp)))))
-
- ;; This is a place holder for unary negation in pp-exp expressions. It is
- ;; changed to call the negate function by the prec parser
-
- (define-struct negate
- (include exp)
- (predicate negate?))
-
- ;; Note: operators are var / con structures with infix? set to #t
-
- ;;; The following ast nodes do not directly correspond to Haskell syntax.
- ;;; They are generated during internal code transformations.
-
- ;;; This returns a number (an Int) associated with the constructor of a
- ;;; value.
-
- (define-struct con-number
- (include exp)
- (slots
- (type (type algdata))
- (value (type exp))))
-
- ;;; This selects a value (denoted by the Int in slot) from a data object
- ;;; created by a specified constructor.
-
- (define-struct sel
- (include exp)
- (slots
- (constructor (type con))
- (slot (type int))
- (value (type exp))))
-
- ;;; This returns True if the data value was built with the designated
- ;;; constructor
-
- (define-struct is-constructor
- (include exp)
- (slots
- (constructor (type con))
- (value (type exp))))
-
- ;;; this is for the type checker only. It turns off
- ;;; type checking for the argument.
-
- (define-struct cast
- (include exp)
- (slots
- (exp (type exp))))
-
- ;; this is used as the body of the let generated by
- ;; dependency analysis
-
- (define-struct void
- (include exp)
- (predicate void?))
-
-
- ;;; These structures are for the type checker. They serve as a placeholder
- ;;; for values which will evaluate to methods or dictionaries.
-
- (define-struct placeholder
- (include exp)
- (predicate placeholder?)
- (slots
- (exp (type (maybe exp)))
- (tyvar (type ntype))
- (overloaded-var (type exp))
- (enclosing-decls (type (list decl)))))
-
- (define-struct method-placeholder
- (include placeholder)
- (predicate method-placeholder?)
- (slots
- ;; the method to be dispatched
- (method (type method-var))
- ))
-
- (define-struct dict-placeholder
- (include placeholder)
- (predicate dict-placeholder?)
- (slots
- ;; the class of dictionary needed
- (class (type class))))
-
- (define-struct recursive-placeholder
- (include exp)
- (slots
- (var (type var))
- (enclosing-decls (type (list decl)))
- ;; this holds the code associated with recursive
- ;; functions or variables. This code instantiates
- ;; the recursive context if necessary.
- (exp (type (maybe exp)))
- ))
-
- ;;; This is used to hold type information associated with a value.
- ;;; The dynamic typing system uses this.
-
- (define-struct dtype-placeholder
- (include exp)
- (predicate dtype-placeholder?)
- (slots
- (exp (type (maybe exp)))
- (tyvar (type ntype))))
-
- ;;; This is used by the type checker to hang on to the original
- ;;; version of a program for message printing. This is removed by
- ;;; the cfn pass.
-
- (define-struct save-old-exp
- (include exp)
- (slots
- (old-exp (type exp))
- (new-exp (type exp))))
-
-
- ;;; This is used for type checking overloaded methods.
-
- (define-struct overloaded-var-ref
- (include exp)
- (slots
- (var (type var))
- (sig (type ntype))))
-
-
-
- ;;; These are used by the CFN.
-
-
- (define-struct case-block
- (include exp)
- (slots
- (block-name (type symbol))
- (exps (type (list exp)))))
-
- (define-struct return-from
- (include exp)
- (slots
- (block-name (type symbol))
- (exp (type exp))))
-
- (define-struct and-exp
- (include exp)
- (slots
- (exps (type (list exp)))))
-
-